iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 24
2
Modern Web

寫給朋友的 PHP 從 0 到 100 實戰教程系列 第 24

Day 24. PHP教學: 實作 FACEBOOK 臉書登入

  • 分享至 

  • xImage
  •  
  1. 首先,先到 https://developers.facebook.com 註冊開發者帳號

  2. 再來開新的應用程式 app 取得 {app_id} 與 {app_secret} (按顯示可以看密鑰)
    https://ithelp.ithome.com.tw/upload/images/20180111/201073941DkPqJ4A43.png

  3. 到左方菜單『應用程式審查』按下公開發布
    https://ithelp.ithome.com.tw/upload/images/20180111/20107394BUjJxqeVt5.png

  4. 到左方菜單『設定』設定 http://localhost/ 開發用網址,照著圖設定
    https://ithelp.ithome.com.tw/upload/images/20180111/20107394TjrbDdRL7I.png
    https://ithelp.ithome.com.tw/upload/images/20180111/20107394QjKdWll3fq.png

應用程式網域一定要設定 localhost
下方有個新增平台 要選『網站』貼網址
https://ithelp.ithome.com.tw/upload/images/20180111/201073945YpU4ZWWA5.png

  1. 到左方菜單『Facebook 登入』設定,如果沒有就按『新增產品』
    https://ithelp.ithome.com.tw/upload/images/20180111/20107394uG8CUAk80x.png

重新導向 URL 一定要跟程式碼一樣複製貼上 http://localhost/game/fb-callback/

對重新導向 URI 使用 Strict 模式 一定要關掉!!!
對重新導向 URI 使用 Strict 模式 一定要關掉!!!
對重新導向 URI 使用 Strict 模式 一定要關掉!!!

  1. 下指令下載套件 $ composer require facebook/graph-sdk
    https://ithelp.ithome.com.tw/upload/images/20180111/2010739436DPzged9W.png

  2. 到 controller 新增 fb-login.php 與 fb-callback.php

<?php
  $fb = new Facebook\Facebook([
    'app_id' => '{app_id}', // 把 {app_id} 換成你的應用程式編號
    'app_secret' => '{app_secret}', // 把 {app_secret} 換成你的應用程式密鑰
    'default_graph_version' => 'v2.2',
    ]);
  
  $helper = $fb->getRedirectLoginHelper();
  
  $permissions = ['email'];
  $loginUrl = $helper->getLoginUrl('http://localhost/game/fb-callback', $permissions);
  
  echo '<a href="' . htmlspecialchars($loginUrl) . '">Log in with Facebook!</a>';
  1. 到 controller 新增 fb-callback.php
<?php
$app_id = '{app_id}'; // 把 {app_id} 換成你的應用程式編號
$app_secret = '{app_secret}';  // 把 {app_secret} 換成你的應用程式密鑰
$fb = new Facebook\Facebook([
    'app_id' => $app_id, 
    'app_secret' => $app_secret, 
    'default_graph_version' => 'v2.2',
    ]);

  $helper = $fb->getRedirectLoginHelper();

  try {
    $accessToken = $helper->getAccessToken();
  } catch(Facebook\Exceptions\FacebookResponseException $e) {
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
  } catch(Facebook\Exceptions\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
  }
  
  if (! isset($accessToken)) {
    if ($helper->getError()) {
      header('HTTP/1.0 401 Unauthorized');
      echo "Error: " . $helper->getError() . "\n";
      echo "Error Code: " . $helper->getErrorCode() . "\n";
      echo "Error Reason: " . $helper->getErrorReason() . "\n";
      echo "Error Description: " . $helper->getErrorDescription() . "\n";
    } else {
      header('HTTP/1.0 400 Bad Request');
      echo 'Bad request';
    }
    exit;
  }
  
  // Logged in
  echo '<h3>Access Token</h3>';
  
  // The OAuth 2.0 client handler helps us manage access tokens
  $oAuth2Client = $fb->getOAuth2Client();
  
  // Get the access token metadata from /debug_token
  $tokenMetadata = $oAuth2Client->debugToken($accessToken);
  echo '<h3>Metadata</h3>';
  var_dump($tokenMetadata);
  
  // Validation (these will throw FacebookSDKException's when they fail)
  $tokenMetadata->validateAppId($app_id); // Replace {app-id} with your app id
  // If you know the user ID this access token belongs to, you can validate it here
  //$tokenMetadata->validateUserId('123');
  $tokenMetadata->validateExpiration();
  
  if (! $accessToken->isLongLived()) {
    // Exchanges a short-lived access token for a long-lived one
    try {
      $accessToken = $oAuth2Client->getLongLivedAccessToken($accessToken);
    } catch (Facebook\Exceptions\FacebookSDKException $e) {
      echo "<p>Error getting long-lived access token: " . $helper->getMessage() . "</p>\n\n";
      exit;
    }
  
    echo '<h3>Long-lived</h3>';
    var_dump($accessToken->getValue());
  }
  
  $_SESSION['fb_access_token'] = (string) $accessToken;
  
  // User is logged in with a long-lived access token.
  // You can redirect them to a members-only page.
  //header('Location: https://example.com/members.php');
  1. 打開網址 http://localhost/game/fb-login 點下登入就可以看到取得的參數囉
    https://ithelp.ithome.com.tw/upload/images/20180111/201073946oSRJb1Wps.png

  2. 把 facebook 帶來的 user_id 跟 email 儲存起來,即可當成是登入驗證囉,細節明天揭曉!


上一篇
Day 23. PHP教學: 串接簡訊王 API
下一篇
Day 25. PHP教學: 實作臉書帳號登入後的註冊
系列文
寫給朋友的 PHP 從 0 到 100 實戰教程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
Capillary J
iT邦新手 4 級 ‧ 2018-01-10 23:28:26

卡賓槍

falconwei iT邦新手 5 級 ‧ 2018-01-11 01:28:08 檢舉

Kar98k

1
火爆浪子
iT邦研究生 1 級 ‧ 2018-05-17 16:35:18

謝謝分享!
有更多細節嗎?

火爆浪子 iT邦研究生 1 級 ‧ 2018-05-25 15:00:13 檢舉

我遇到一個問就是一直取不到 $accessToken = $helper->getAccessToken();

0
eric19740521
iT邦新手 1 級 ‧ 2019-10-17 18:14:54

Strict 模式的運作方式
這沒辦法關閉了

我要留言

立即登入留言